#! /bin/bash
# -*- coding: utf-8 -*-
#* ******************************************************************
#* ILP -- Implantation d'un langage de programmation.
#* Copyright (C) 2004 <Christian.Queinnec@lip6.fr>
#* $Id: compileThenRun.sh 1238 2012-09-12 15:31:08Z queinnec $
#* GPL version>=2
#* ******************************************************************
# Compiler le fichier templateTest.c dûment instancié avec le fichier 
# passé en argument.

USAGE="Usage: $0 [ -template.c ] [ +gc ] [ +v ] foo.c [baz.c -Dq=3 ...]
Compile les fichiers C, cree puis lance l'executable /tmp/templateTest$USER

template.c est le fichier devant inclure foo.c
   [Il y a un patron par version d'ILP]
+gc est une option incluant le GC de Boehm (si utilisable)
+v montre sans l'executer la commande gcc synthetisee
foo.c est le resultat de la compilation d'ILP
bar.o sont des modules compiles a utiliser plutot que ceux de libilp.a
   [libilp.a contient les modules par defaut d'ILP1. Pour certaines
    versions d'ILP, il faut des modules plus appropries.]
hux.h est un fichier d'entete a inclure pour la compilation de foo.c
baz.c est un fichier C a compiler en meme temps que foo.c
-Dvar=val  variable cpp supplementaire a passer a gcc
    
EXEMPLES:
    pour ILP1:
       $0 foo.c
    pour ILP2:
       $0 -templateTest2.c foo.c
    pour ILP3 ou ILP4:
       $0 -templateTest3.c foo.c ilpError.o
    pour ILP6:
       $0 -templateTest6.c foo.c ilpObj.o

Ce script est egalement sensible aux variables d'environnement:
  OTHER_LIBS   ajout de bibliotheques supplementaires
  TEMPLATE     definition du patron a utiliser
"

# Les variables contrôlant si l'on utilise le GC de Boehm:
#    Chemin relatif vers la bibliotheque statique:

#LIB_GC=$mas/lib/gc.a 
LIB_GC=mark_and_sweep.a #changement pour CA


#    Incorpore-t-on un GC ou pas ?
#WITH_GC=false
WITH_GC=true #hack CA rendre propre

# Montre-t-on la commande gcc synthetisee
VERBOSE=false

# Le fichier servant de réceptacle au code C produit:
# Par defaut, on utilise celui a cote de ce script.
TEMPLATE=${TEMPLATE:-`dirname $0`/templateTest.c}

case "$1" in 
    -*.c)
        TEMPLATE=${1#-}
        shift
        case "$TEMPLATE" in
            /*)
                :
                ;;
            *)
                TEMPLATE=`pwd`/$TEMPLATE
                ;;
        esac
        ;;
    -*)
        echo "Unknown option: $1" >&2
        exit 11
        ;;
esac

# Y a-t-il d'autres options comme +gc ou +v ?
while [ $# -gt 0 ]
do 
    case "$1" in 
        +gc)
            WITH_GC=true
            shift
            ;;
        +v)
            VERBOSE=true
            shift
            ;;
        *)
            break
            ;;
    esac
done

# Le fichier de code C produit par ILP à compiler avec gcc:
FILE=$1
shift

CFLAGS='-Wall -Wno-unused-variable -Wno-unused-label -std=c99 -pedantic -g '
# NOTE: Il y a des tests avec des variables inutilisees, ne pas
# attirer l'attention dessus.

# C'est utile pour utiliser des tables associatives pour le tme8
UNAME_FLAGS=" -o"
if [ -n "${Apple_PubSub_Socket_Render}" ]
then
    # Sur MacOSX (il y a surement mieux comme test!)
    # Pas d'option -o sur MacOSX
    UNAME_FLAGS=''
else
    if pkg-config --exists glib-2.0 2>/dev/null
    then
        CFLAGS="$CFLAGS"`pkg-config --cflags --libs glib-2.0` 
    fi
fi

if [ -r "$FILE" ]
then 
    # Rendre FILE absolu:
    case "$FILE" in
        /*)
            true
            ;;
        *)
            FILE=`pwd`/$FILE
            ;;
    esac
else
    echo Fichier inexistant: $FILE >&2
    exit 1
fi

COMMAND_DIR=`dirname $0`
case "$COMMAND_DIR" in
    # rendre le repertoire qui contient compileThenRun.sh absolu:
    /*)
        true
        ;;
    *)
        COMMAND_DIR=`pwd`/$COMMAND_DIR
        ;;
esac

# Si les .c ne sont pas compilés pour l'architecture courante, on les
# recompile à la volée.
( cd $COMMAND_DIR/
  RECOMPILE=true
  if [ -r ./HOSTTYPE ]
  then if [ "$(< ./HOSTTYPE)" = "`uname -s -r -v -m ${UNAME_FLAGS}`" ]
       then RECOMPILE=false
       fi
  fi
  if $RECOMPILE
  then 
      echo "Compilation de la bibliotheque d'execution d'ILP..." >&2
      make clean
      if make work
      then :
      else
          echo "GC non compilable: option +gc non possible!" >&2
          exit 13
      fi
  fi 1>&2
)

if [ ! -r $COMMAND_DIR/libilp.a ]
then 
    echo Bibliotheque introuvable: $COMMAND_DIR/libilp.a >&2
    exit 3
fi

if [ ! -r $TEMPLATE ]
then 
    echo Patron introuvable: $TEMPLATE >&2
    exit 5
fi

cp "/home/kikuchi/documents/informatique/upmc/ca/projet/mark_and_sweep/lib/$LIB_GC" $COMMAND_DIR #sale.... effectué pour CA

if $WITH_GC
then
    if [ -r $COMMAND_DIR/$LIB_GC ]
    then
        CFLAGS="-DWITH_GC $CFLAGS"
    else
        echo "GC introuvable (consulter Makefile): $COMMAND_DIR/$LIB_GC" >&2
        # On continue sans GC puisque non compilé!
        WITH_GC=false
    fi
fi

HFILE=/tmp/templateTest$USER.h
if [ -r $HFILE ]
then rm -f $HFILE
fi

# Collecter les fichiers (.o, .a .h ou .c) à incorporer et les rendre absolus:
OFILES=${OFILES:-}
for file
do
  case "$file" in
      -[DI]*)
          CFLAGS="$CFLAGS $file"
          ;;
      *)
          case "$file" in 
              /*.[coa])
                  OFILES="$OFILES $file"
                  ;;
              *.[coa])
                  file=$COMMAND_DIR/$file
                  OFILES="$OFILES $file"
                  ;;
              /*.h)
                  echo "#include \"$file\" " >>$HFILE
                  ;;
              *.h)
                  file=$COMMAND_DIR/$file
                  echo "#include \"$file\" " >>$HFILE
                  ;;
          esac
          if [ ! -r $file ]
          then 
              echo Fichier introuvable: $file >&2
              exit 7
          fi
          ;;
  esac
done

if [ -s $HFILE ]
then CFLAGS="$CFLAGS -DFICHIER_H=\"$HFILE\" "
fi

OTHER_LIBS=${OTHER_LIBS:- -lm}
if $WITH_GC
then OTHER_LIBS="$OTHER_LIBS $COMMAND_DIR/$LIB_GC"
fi


# AJOUT POUR CA:
SRC_DIR="ca_c/src"
BIN_DIR="ca_c/bin"

if [ ! -d $SRC_DIR ]; then mkdir -p $SRC_DIR; fi
if [ ! -d $BIN_DIR ]; then mkdir -p $BIN_DIR; fi

#AOUT=${TMPDIR:-/tmp}/templateTest$USER
AOUT="$BIN_DIR/$(basename $FILE .c)" #changement pour CA

if [ -r $AOUT ]
then rm -f $AOUT
fi

if $VERBOSE
then 
    echo gcc ${CFLAGS} -o $AOUT -DFICHIER_C="\"$FILE\"" \
    -I. -I$COMMAND_DIR \
    $TEMPLATE \
    $OFILES $COMMAND_DIR/libilp.a $OTHER_LIBS '&&' $AOUT
fi

#echo Trying to compile $FILE ... >&2
gcc ${CFLAGS} -o $AOUT -DFICHIER_C="\"$FILE\"" \
    -I. -I$COMMAND_DIR \
    $TEMPLATE \
    $OFILES $COMMAND_DIR/libilp.a $OTHER_LIBS && \

$AOUT

# end of compileThenRun.sh
